package com.duoduo.rule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ribbon是什么？
 *      SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
 *      简单地说，Ribbon是Netflix发布的开源项目，主要功能是提供客户端的软件负载均衡算法和服务调用。
 *      Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单地说，就是在配置文件中列出Load Balancer(简称LB)后面所有的机器，
 *      Ribbon会自动的帮助你基于某种规则（如简单轮询、随机连接等）去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。
 * 如何自定义ribbon规则
 *  官方文档明确给出了警告：
 *      这个自定义配置类不能放在@ComponentScan所扫描的当前包以及子包下，
 *      否则我们自定义的这个配置类就会被所有的ribbon客户端所共享，达不到特殊化定制的目的了。
 * @author qian
 * @version 1.0
 * @date 2020/11/20 21:09
 */
@Configuration
public class MyRibbonRule {

    /**
     * com.netflix.loadbalancer.RoundRobinRule 轮询
     * com.netflix.loadbalancer.RandomRule 随机
     * com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略获取服务，如果获取服务失败则在指定时间内会进行重试
     * WeightedResponseTimeRule 对RoundRobinRule的扩展，响应速度越快的实例选择权重越大，越容易被选择
     * BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，然后选择一个并发量最小的服务
     * AvailabilityFilteringRule 先过滤掉故障实例，再选择并发较小的实例
     * ZoneAvoidanceRule 默认规则，复合判断server所在区域的性能和server的可用性选择服务器
     * @return
     */
    @Bean
    public IRule myRule(){
        return new RandomRule(); //随机
    }
}
